package org.example.netty.test.nio.netty.chat.handler;

import io.netty.buffer.ByteBuf;
import io.netty.buffer.ByteBufAllocator;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelPipeline;
import io.netty.channel.embedded.EmbeddedChannel;
import io.netty.channel.socket.nio.NioSocketChannel;
import io.netty.handler.codec.LengthFieldBasedFrameDecoder;
import io.netty.handler.logging.LogLevel;
import io.netty.handler.logging.LoggingHandler;
import io.netty.handler.timeout.IdleStateHandler;
import lombok.extern.slf4j.Slf4j;
import org.example.netty.test.nio.netty.chat.bean.LoginMessage;
import org.example.netty.test.nio.netty.chat.protocol.MyAgreeOnMessageCodec;

import java.util.concurrent.TimeUnit;

/**
 * @author zp
 * @version 1.0
 * @description: 基类处理器 添加一些必要的处理器
 * @date 2023/4/1 15:57
 */
@Slf4j
public class ChatBaseHandler extends ChannelInitializer<NioSocketChannel> {

    @Override
    protected void initChannel(NioSocketChannel ch) throws Exception {
        ChannelPipeline pipeline = ch.pipeline();
        // 添加日志处理器
        //pipeline.addLast("loggerHandler", new LoggingHandler(LogLevel.DEBUG));

        // 添加字段长度解析器 解析ByteBuf的数据
        pipeline.addLast("frameDecoder", new LengthFieldBasedFrameDecoder(Integer.MAX_VALUE, 24, 4, 0, 0));
        // 添加自定义协议的编码和解码器
        pipeline.addLast("myAgreeOnMessageCodec", new MyAgreeOnMessageCodec());
        // 添加输入操作 把Message 转化成对应的类型
        // 转换类型的Handler
        // pipeline.addLast("changeMessageHandler",new ChangeMessageHandler());
        //添加空闲监测器
        //一般我们使用的IdleStateHandler的构造函数有4个参数：
        //long readerIdleTimeSeconds：Channel多久没有读取数据会触发IdleStateEvent，其中IdleState为IdleState.READER_IDLE。
        //long writerIdleTimeSeconds：Channel多久没有写数据会触发IdleStateEvent，其中IdleState为IdleState.WRITER_IDLE。
        //long allIdleTimeSeconds：Channel多久没有读和写数据会触发IdleStateEvent，其中IdleState为IdleState.ALL_IDLE。
        //TimeUnit unit：时间单位
        // 五秒之内未有读操作 触发监听器
        pipeline.addLast("idleStateHandler", new IdleStateHandler(5, 0, 0, TimeUnit.SECONDS));
        // 处理心跳监听器触发之后的操作
        pipeline.addLast("serverIdleHandler", new ServerIdleHandler());
        // 注册
        pipeline.addLast("registerMessageHandler",new RegisterMessageHandler());
        // 登入
        pipeline.addLast("logMessageHandler",new LoginMessageHandler());
        // 增加登入校验
        pipeline.addLast("verificationLoginStatusHandler", new VerificationLoginStatusHandler());
        // 心跳包处理器
        pipeline.addLast("pingMessageHandler", new PingMessageHandler());
        // 加入群聊天
        pipeline.addLast("joinGroupMessageHandler",new JoinGroupMessageHandler());
        // 加入单独聊天
        pipeline.addLast("joinUserMessageHandler",new JoinUserMessageHandler());
        // 加入单独聊天
        pipeline.addLast("createGroupMessageHandler",new CreateGroupMessageHandler());
        // 退出群聊天
        pipeline.addLast("outGroupMessageHandler",new OutGroupMessageHandler());
        // 退出单独聊天
        pipeline.addLast("outUserMessageHandler",new OutUserMessageHandler());
        // 发送群消息
        pipeline.addLast("sendGroupMessageHandler",new SendGroupMessageHandler());
        // 发送私聊消息
        pipeline.addLast("sendUserMessageHandler",new SendUserMessageHandler());
        // 获取所有用户列表
        pipeline.addLast("getAllUserMessageHandler", new GetALLUserMessageHandler());
        // 获取所有群聊列表
        pipeline.addLast("getALLGroupNameMessageHandler", new GetALLGroupNameMessageHandler());
        // 获取所有用户列表
        pipeline.addLast("getAddUserMessageHandler", new GetAddUserMessageHandler());
        // 获取所有群聊列表
        pipeline.addLast("getAddGroupNameMessageHandler", new GetAddGroupNameMessageHandler());
        // 登出
        pipeline.addLast("logoutMessageHandler",new LogoutMessageHandler());
        // RPC远程调用
        pipeline.addLast("rpcRequestHandler",new RpcRequestHandler());
    }
}
